#include<sys/un.h>
#include<sys/socket.h>
#include<string.h>
#include<assert.h>
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include <stdlib.h>

#define SV_SOCK_PATH "/tmp/us_xfr"

#define BUF_SIZE 1024
#define BACKLOG 5
int main(int argc ,char ** argv)
{
    if(argc < 2 || !strcmp("--help",argv[1])) 
        printf("%s msg...\n", argv[0]),exit(1);
    // 打开文件描述符
    int sfd = socket(AF_UNIX,SOCK_DGRAM,0);    

    struct sockaddr_un svaddr,claddr;

    // 初始化公共地址（文件）
    int len = sizeof(struct sockaddr_un);
    memset(&claddr,0,len);
    claddr.sun_family = AF_UNIX;
    // 这个用来给对方发送回来的文件
    snprintf(claddr.sun_path,sizeof(claddr.sun_path),"/tmp/us_xfr.%d",getpid());
    assert(bind(sfd,(struct sockaddr *) &claddr,len) != -1);
   
   // 这个用来向对方通信
    memset(&svaddr, 0, len);
    svaddr.sun_family = AF_UNIX;
    strncpy(svaddr.sun_path, SV_SOCK_PATH, sizeof(svaddr.sun_path) - 1);
    
    
    char buf[BUF_SIZE];
    char resp[BUF_SIZE];
    for(int i = 1;i < argc; ++ i){
        int numSend , msgLen = strlen(argv[i]);
        // 发送到对方的文件svaddr中
        assert( sendto(sfd,argv[i],msgLen,0,(struct sockaddr *) &svaddr,len) == msgLen );
       // 从文件
        assert((numSend = recvfrom(sfd,resp,BUF_SIZE,0,NULL,NULL) ) != -1);
        // %.*s代表输出字符串长度是 numSend
        printf("Response %d  : %.*s\n",i,numSend,resp);
    }
    assert(remove(claddr.sun_path) != - 1);
    return 0;
}